/* 异步任务类 */

/*
    function(arr){
        let task = new Task(10,result=>{
            next(result);
        });

        for(let a of arr){
            a.then(data=>{
                task.push(data);
            })
        }

        let next = result =>{
            console.log("任务完成",result);
        }
    }
*/

class Task {
    
    //@member taskNum:Int 任务数量
    //@member callback:function(result:[]) 任务完成时回调函数
    constructor(taskNum, callback) {
        this.taskNum = taskNum;
        this.callback = callback;

        this._completed = false; //完成状态
        this._array = [];       //内部数组，记录提交的数据
        this._params = {};      //可以用set get存一些数据
    }

    //完成一个任务时调用push提交任务
    //可以提交一个信息存入array中，回调函数可获得array
    //@param flag:any 
    push(flag) {
        if (this._completed) {
            return;
        }

        this._array.push(flag);
        this.taskNum--;
        if (this.taskNum <= 0) {
            this._completed = true;
            setTimeout(() => {
                console.log("Tasks _completed:", this._array.length);
                this.callback(this._array)
            }, 1);
        }
    }

    //重置任务状态
    //_completed为false将抛出Error
    reset(){
        if(!this._completed){

        }
    }

    //获取任务状态
    getState(){
        return this._completed
    }
    
    //设置为完成状态
    //触发回调函数
    setCompleted(){
        if(this._completed){
            return
        }

        this._completed = true;
        this.callback(this._array);
    }

    //写入自定义数据
    set(key,value){
        this._params[key]=value;
    }

    //读取自定义数据
    get(key){
        return this._params[key];
    }

    //获取任务提交信息
    getResult() {
        return this._array;
    }
}


module.exports = {
    Task,
}